home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / gnu / glibc108.gz / glibc108 / glibc-1.08.1 / sunrpc / getrpcent.c < prev    next >
C/C++ Source or Header  |  1994-02-08  |  5KB  |  236 lines

  1. /* @(#)getrpcent.c    2.2 88/07/29 4.0 RPCSRC */
  2. #if !defined(lint) && defined(SCCSIDS)
  3. static  char sccsid[] = "@(#)getrpcent.c 1.9 87/08/11  Copyr 1984 Sun Micro";
  4. #endif
  5.  
  6. /*
  7.  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
  8.  * unrestricted use provided that this legend is included on all tape
  9.  * media and as a part of the software program in whole or part.  Users
  10.  * may copy or modify Sun RPC without charge, but are not authorized
  11.  * to license or distribute it to anyone else except as part of a product or
  12.  * program developed by the user.
  13.  * 
  14.  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
  15.  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
  16.  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
  17.  * 
  18.  * Sun RPC is provided with no support and without any obligation on the
  19.  * part of Sun Microsystems, Inc. to assist in its use, correction,
  20.  * modification or enhancement.
  21.  * 
  22.  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
  23.  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
  24.  * OR ANY PART THEREOF.
  25.  * 
  26.  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
  27.  * or profits or other special, indirect and consequential damages, even if
  28.  * Sun has been advised of the possibility of such damages.
  29.  * 
  30.  * Sun Microsystems, Inc.
  31.  * 2550 Garcia Avenue
  32.  * Mountain View, California  94043
  33.  */
  34.  
  35. /*
  36.  * Copyright (c) 1985 by Sun Microsystems, Inc.
  37.  */
  38.  
  39. #include <stdio.h>
  40. #include <sys/types.h>
  41. #include <rpc/rpc.h>
  42. #include <netdb.h>
  43. #include <sys/socket.h>
  44.  
  45. /*
  46.  * Internet version.
  47.  */
  48. struct rpcdata {
  49.     FILE    *rpcf;
  50.     char    *current;
  51.     int    currentlen;
  52.     int    stayopen;
  53. #define    MAXALIASES    35
  54.     char    *rpc_aliases[MAXALIASES];
  55.     struct    rpcent rpc;
  56.     char    line[BUFSIZ+1];
  57.     char    *domain;
  58. } *rpcdata, *_rpcdata();
  59.  
  60. static    struct rpcent *interpret();
  61. struct    hostent *gethostent();
  62. char    *inet_ntoa();
  63. extern    char *index();        /* Changed from static by roland@gnu */
  64.  
  65. static char RPCDB[] = _PATH_RPC; /* Changed from "/etc/rpc" by roland@gnu */
  66.  
  67. static struct rpcdata *
  68. _rpcdata()
  69. {
  70.     register struct rpcdata *d = rpcdata;
  71.  
  72.     if (d == 0) {
  73.         d = (struct rpcdata *)calloc(1, sizeof (struct rpcdata));
  74.         rpcdata = d;
  75.     }
  76.     return (d);
  77. }
  78.  
  79. struct rpcent *
  80. getrpcbynumber(number)
  81.     register int number;
  82. {
  83.     register struct rpcdata *d = _rpcdata();
  84.     register struct rpcent *p;
  85.     int reason;
  86.     char adrstr[16], *val = NULL;
  87.     int vallen;
  88.  
  89.     if (d == 0)
  90.         return (0);
  91.     setrpcent(0);
  92.     while (p = getrpcent()) {
  93.         if (p->r_number == number)
  94.             break;
  95.     }
  96.     endrpcent();
  97.     return (p);
  98. }
  99.  
  100. struct rpcent *
  101. getrpcbyname(name)
  102.      const char *name;        /* const added by roland@gnu */
  103. {
  104.     struct rpcent *rpc;
  105.     char **rp;
  106.  
  107.     setrpcent(0);
  108.     while(rpc = getrpcent()) {
  109.         if (strcmp(rpc->r_name, name) == 0)
  110.             return (rpc);
  111.         for (rp = rpc->r_aliases; *rp != NULL; rp++) {
  112.             if (strcmp(*rp, name) == 0)
  113.                 return (rpc);
  114.         }
  115.     }
  116.     endrpcent();
  117.     return (NULL);
  118. }
  119.  
  120. setrpcent(f)
  121.     int f;
  122. {
  123.     register struct rpcdata *d = _rpcdata();
  124.  
  125.     if (d == 0)
  126.         return;
  127.     if (d->rpcf == NULL)
  128.         d->rpcf = fopen(RPCDB, "r");
  129.     else
  130.         rewind(d->rpcf);
  131.     if (d->current)
  132.         free(d->current);
  133.     d->current = NULL;
  134.     d->stayopen |= f;
  135. }
  136.  
  137. endrpcent()
  138. {
  139.     register struct rpcdata *d = _rpcdata();
  140.  
  141.     if (d == 0)
  142.         return;
  143.     if (d->current && !d->stayopen) {
  144.         free(d->current);
  145.         d->current = NULL;
  146.     }
  147.     if (d->rpcf && !d->stayopen) {
  148.         fclose(d->rpcf);
  149.         d->rpcf = NULL;
  150.     }
  151. }
  152.  
  153. struct rpcent *
  154. getrpcent()
  155. {
  156.     struct rpcent *hp;
  157.     int reason;
  158.     char *key = NULL, *val = NULL;
  159.     int keylen, vallen;
  160.     register struct rpcdata *d = _rpcdata();
  161.  
  162.     if (d == 0)
  163.         return(NULL);
  164.     if (d->rpcf == NULL && (d->rpcf = fopen(RPCDB, "r")) == NULL)
  165.         return (NULL);
  166.     if (fgets(d->line, BUFSIZ, d->rpcf) == NULL)
  167.         return (NULL);
  168.     return interpret(d->line, strlen(d->line));
  169. }
  170.  
  171. static struct rpcent *
  172. interpret(val, len)
  173. {
  174.     register struct rpcdata *d = _rpcdata();
  175.     char *p;
  176.     register char *cp, **q;
  177.  
  178.     if (d == 0)
  179.         return;
  180.     strncpy(d->line, val, len);
  181.     p = d->line;
  182.     d->line[len] = '\n';
  183.     if (*p == '#')
  184.         return (getrpcent());
  185.     cp = index(p, '#');
  186.     if (cp == NULL)
  187.     {
  188.         cp = index(p, '\n');
  189.         if (cp == NULL)
  190.             return (getrpcent());
  191.     }
  192.     *cp = '\0';
  193.     cp = index(p, ' ');
  194.     if (cp == NULL)
  195.     {
  196.         cp = index(p, '\t');
  197.         if (cp == NULL)
  198.             return (getrpcent());
  199.     }
  200.     *cp++ = '\0';
  201.     /* THIS STUFF IS INTERNET SPECIFIC */
  202.     d->rpc.r_name = d->line;
  203.     while (*cp == ' ' || *cp == '\t')
  204.         cp++;
  205.     d->rpc.r_number = atoi(cp);
  206.     q = d->rpc.r_aliases = d->rpc_aliases;
  207.     cp = index(p, ' ');
  208.     if (cp != NULL)
  209.         *cp++ = '\0';
  210.     else
  211.     {
  212.         cp = index(p, '\t');
  213.         if (cp != NULL)
  214.             *cp++ = '\0';
  215.     }
  216.     while (cp && *cp) {
  217.         if (*cp == ' ' || *cp == '\t') {
  218.             cp++;
  219.             continue;
  220.         }
  221.         if (q < &(d->rpc_aliases[MAXALIASES - 1]))
  222.             *q++ = cp;
  223.         cp = index(p, ' ');
  224.         if (cp != NULL)
  225.             *cp++ = '\0';
  226.         else
  227.         {
  228.             cp = index(p, '\t');
  229.             if (cp != NULL)
  230.                 *cp++ = '\0';
  231.         }
  232.     }
  233.     *q = NULL;
  234.     return (&d->rpc);
  235. }
  236.